﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ShuticsEntities;
using System.Data.Entity;
using System.Data.Linq.SqlClient;

namespace ShuticsBiz
{
    public static class ControlPuesto
    {
        public static List<Empresa> GetEmpresas()
        {
            return Model.context.Empresa.OrderBy(c => c.Nombre).ToList();
        }

        public static List<Puesto> Buscar(string nomEmp, string nomPuesto, string cod)
        {
            var puestos = Model.context.Puesto.Where(p => p.Codigo.Contains(cod.Trim()) &&
                                                        p.Nombre.Contains(nomPuesto) &&
                                                        p.Empresa.Nombre.Contains(nomEmp) &&
                                                        p.Eliminado.Equals(false)).ToList();

            
            foreach (Puesto p in puestos)
            {
                p.EmpresaReference.Load();
                p.Evaluaciones.Load();
                p.Ponderaciones.Load();
                foreach (PuestoCompetencia pc in p.Ponderaciones)
                {
                    pc.CompetenciaReference.Load();
                }
            }

            return puestos.ToList();
        }

        public static bool Eliminar(Puesto pu, string usuario)
        {
            if (pu.Evaluaciones.Count > 0)
            {
                return false;
            }

            pu.Eliminado = true;
            pu.FechaYhora = DateTime.Now;
            pu.Usuario = usuario;
            try
            {
                Model.context.SaveChanges();
                return true;
            }
            catch (Exception e)
            {
                throw e;
            }
        }

        public static bool Guardar(string cod, string nom, string desc, Empresa emp, Dictionary<Competencia,int> dic)
        {
            bool existe = Model.context.Puesto.Where(c => (c.Codigo.Equals(cod) || c.Nombre.Equals(nom)) && c.Eliminado == false)
                                        .ToList().Count > 0 ? true : false;

            if (existe)
            {
                return false;
            }
            else
            {
                try
                {
                    Puesto p = new Puesto();
                    p.Codigo = cod;
                    p.Nombre = nom;
                    p.Descripcion = desc;
                    p.Empresa = emp;
                    foreach (KeyValuePair<Competencia, int> item in dic)
                    {
                        PuestoCompetencia pc = new PuestoCompetencia();
                        pc.Competencia = item.Key;
                        pc.Ponderacion = item.Value;
                        p.Ponderaciones.Add(pc);
                    }

                    Model.context.Puesto.AddObject(p);

                    Model.context.SaveChanges();
                    return true;
                }
                catch (Exception e)
                {
                    throw e;
                }
            }
        }

        public static List<Puesto> GetPuestos()
        {
            List<Puesto> puestos = Model.context.Puesto.Include("Empresa").Include("Ponderaciones").Where(c => c.Eliminado == false).OrderBy(c => c.Nombre).ToList();
            
            return puestos;
        }

        public static List<Competencia> EsEvaluable(Puesto p)
        {
            List<Competencia> compNoEvaluables = new List<Competencia>();

            foreach (PuestoCompetencia pc in p.Ponderaciones)
            {
                if (!pc.Competencia.Eliminado && !ControlCompetencia.EsEvaluable(pc.Competencia))
                {
                    compNoEvaluables.Add(pc.Competencia);
                }
            }

            return compNoEvaluables;
        }
    }
}
